package org.javahispano.javacup.tacticas_aceptadas.sjvc.SubTacticasAtaque;
import org.javahispano.javacup.modelo.*;

import org.javahispano.javacup.tacticas_aceptadas.sjvc.Comandos;
import org.javahispano.javacup.tacticas_aceptadas.sjvc.SituacionPartidoSergio;
import org.javahispano.javacup.tacticas_aceptadas.sjvc.SubTacticaAtaque;


import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class STACentraPorLaBanda extends SubTacticaAtaque {

	protected Posicion[] posicionesVentajosas;
	protected Posicion posicionCentre;
	protected int kJugadoresAPorElBalon = 2;
	
	public STACentraPorLaBanda(){
		posicionesVentajosas = new Posicion[3];
		posicionCentre = null;
	}
	
	protected Posicion ObtenerPosicionVentajosa(){
		return new Posicion( (new Random().nextInt(2) % 2 == 0 ? -1 : 1) * Constantes.ANCHO_CAMPO_JUEGO/(8 + new Random().nextDouble()*64), Constantes.LARGO_CAMPO_JUEGO/(2 + new Random().nextDouble()));
	}
	
	protected Posicion ObtenerPosicionCentre(boolean izquierda){
		return new Posicion( (izquierda ? -1 : 1) * Constantes.ANCHO_CAMPO_JUEGO/(2 + new Random().nextDouble()*2), Constantes.LARGO_CAMPO_JUEGO/(2 + new Random().nextDouble() * 2));
	}
	
	@Override
	protected List<Comando> _ejecutar(SituacionPartido sp, SituacionPartidoSergio spAnterior) {
		
		List<Comando> comandos = new LinkedList<Comando>();
		
		//reseteo posici�n de cierre
		if(sp.balon().getY() > 0)
			posicionCentre = null;
		
		//Durante el partido, la posicion "ventajosa" cambia
		if(posicionesVentajosas[0] == null || sp.iteracion() % (Constantes.ITERACIONES/16) == 0){
			for(int i=0;i<posicionesVentajosas.length;i++)
				posicionesVentajosas[i] = ObtenerPosicionVentajosa();
		}
		
		//Jugadores que van a por el bal�n
		int[] excluidos = new int[posicionesVentajosas.length];
		for(int i=0;i<posicionesVentajosas.length;i++)
			excluidos[i] = 10 - i;
		Comandos.IrAPorElBalon(sp, kJugadoresAPorElBalon, comandos, excluidos);
		
		//Mi jugador 6 es el m�s r�pido, va siempre a por el bal�n
		comandos.add(new ComandoIrA(5,sp.balon()));
		
		int jugCercano = sp.balon().indiceMasCercano(sp.misJugadores());
		
		//Si tengo el bal�n...
		if(sp.misJugadores()[jugCercano].distancia(sp.balon()) <= Constantes.DISTANCIA_CONTROL_BALON){
			
			//Si estoy cerca de la porter�a o soy de los que remantan chuto a uno de los dos postes
			if(!sp.saco() && (jugCercano >= 11 - posicionesVentajosas.length || sp.balon().distancia(Constantes.centroArcoSup) <= Constantes.DISTANCIA_PENAL)){
				Posicion destinoBola = new Posicion((new Random().nextDouble() < 0.5 ? Constantes.posteDerArcoSup.getX() - 3 : Constantes.posteIzqArcoSup.getX() + 3), Constantes.posteDerArcoSup.getY());
				comandos.add(new ComandoGolpearBalon(jugCercano, destinoBola, 1, false));
			}
			
			//Si estoy cerca de las ventajosas, centro
			else if(sp.balon().distancia(posicionesVentajosas[0]) < Constantes.DISTANCIA_PENAL * 3){
				Comandos.Pase(sp, jugCercano, 10 - new Random().nextInt(posicionesVentajosas.length), comandos);
			}
			
			//Si ni chuto ni centro, corro hacia la posici�n de centre
			else{
				if(posicionCentre == null)
					posicionCentre = ObtenerPosicionCentre(sp.misJugadores()[jugCercano].getX() < 0);
				
				comandos.add(new ComandoGolpearBalon(jugCercano));
				comandos.add(new ComandoIrA(jugCercano, posicionCentre));
				
				//Si hay un rival cerca, despejo hacia alante
				if(jugCercano != 5 &&  sp.balon().distancia( sp.rivales()[sp.balon().indiceMasCercano(sp.rivales())] ) <= Constantes.DISTANCIA_CONTROL_BALON * 2 )
					comandos.add(new ComandoGolpearBalon(jugCercano, Constantes.centroArcoSup, 1, true));
			}
				
		}
		
		//3 jugadores se reparten cerca de la posici�n ventajosa
		for(int i=0;i<posicionesVentajosas.length;i++)
			comandos.add(new ComandoIrA(10 - i, posicionesVentajosas[i]));
		
		//Si soy uno de los que rematan y tengo el bal�n cerquita, voy a por �l
		for(int i=0;i<posicionesVentajosas.length;i++)
			if(sp.balon().distancia(sp.misJugadores()[10 - i]) < Constantes.DISTANCIA_PENAL * (1+(double)i/(double)2))
				comandos.add(new ComandoIrA(10 - i, sp.balon()));
		
		return comandos;
	}
}